package concurrent.util;

import java.util.concurrent.Semaphore;

/**
 * User: Administrator
 * Date: 2020/11/27
 * Time: 15:28
 * Description:
 *      Semaphore信号量，是一个线程同步工具，主要用于在一个时刻允许多个线程对共享资源并行操作的
 *  场景。
 *  1、如果此时Semaphore内部计数器大于零，那么线程可以获得小于该计数器数量的许可，同时减少
 *  所发放的数量
 *  2、如果Semaphore内部计数器等于零，那么线程可能会阻塞（tryAcquire不会阻塞）
 *  3、当线程不再使用许可时，需要立即释放以供其他线程使用
 *
 *  此类模拟最多只能同时有10个用户登录在线
 */
public class SemaphoreDemo {

    static final int MAX_MOUNT = 10;

    static class LoginService{
        private Semaphore semaphore = new Semaphore(MAX_MOUNT);

        private void login() throws InterruptedException {
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName() + "登录成功");
        }

        private void loginOut() {
            semaphore.release();
            System.out.println(Thread.currentThread().getName() + "退出登录");
        }
    }

    public static void main(String[] args) {
        LoginService loginService = new LoginService();
        for (int i = 0; i < 11; i++) {
            new Thread(()->{
                try {
                    loginService.login();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }

    }
}
